package cn.edu.seu.ssny.service.impl;

import cn.edu.seu.ssny.dao.*;
import cn.edu.seu.ssny.entity.MachineGroup;
import cn.edu.seu.ssny.entity.Project;
import cn.edu.seu.ssny.entity.StatisticsPowercostRateType;
import cn.edu.seu.ssny.enums.StatisticsEnum;
import cn.edu.seu.ssny.service.IQueryDeviceService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
public class QueryDeviceServiceImpl implements IQueryDeviceService {

    @Autowired
    private IStatisticsConfigDao statisticsConfigDao;

    @Autowired
    private IStatisticsPowercostRateTypeDao statisticsPowercostRateTypeDao;

    @Autowired
    private IStatisticsPowercostRateConfigDao statisticsPowercostRateConfigDao;

    @Autowired
    private IMachineGroupDao machineGroupDao;

    @Autowired
    private IMachineGroupConfigDao machineGroupConfigDao;

    /**
     * 功能描述:
     * <返回所有需要进行可再生能源利用量统计的采集点
     * <如果查询结果为空，就返回空列表，不返回null
     *
     * @return
     */
    @Override
    public List<Integer> findAllRenewEnergyDeviceIds() {
        List<Integer> deviceIds = statisticsConfigDao.findDeviceIdsByStatisticsTypeId(StatisticsEnum.StatisticsRenewEnergy.value());
        if (deviceIds == null) {
            return new ArrayList<>();
        }
        return deviceIds;
    }

    /**
     * 功能描述:
     * <返回所有需要进行节约标煤量统计的采集点
     * <如果查询结果为空，就返回空列表，不返回null
     *
     * @return
     */
    @Override
    public List<Integer> findAllCoalSavedDeviceIds() {
        List<Integer> deviceIds = statisticsConfigDao.findDeviceIdsByStatisticsTypeId(StatisticsEnum.StatisticsCoalSaved.value());
        if (deviceIds == null) {
            return new ArrayList<>();
        }
        return deviceIds;
    }

    /**
     * 功能描述:
     * <返回所有需要进行碳排放量统计的采集点
     * <如果查询结果为空，就返回空列表，不返回null
     *
     * @return
     */
    @Override
    public List<Integer> findAllCarbonEmissionDeviceIds() {
        List<Integer> deviceIds = statisticsConfigDao.findDeviceIdsByStatisticsTypeId(StatisticsEnum.StatisticsCarbonEmission.value());
        if (deviceIds == null) {
            return new ArrayList<>();
        }
        return deviceIds;
    }

    /**
     * 功能描述:
     * <返回所有需要进行供暖能耗统计的采集点(指定项目)
     * <如果查询结果为空，就返回空列表，不返回null
     *
     * @param project
     * @return
     */
    @Override
    public List<Integer> findAllHeatingPowercostDeviceIds(Project project) {
        List<Integer> deviceIds = statisticsConfigDao.findDeviceIdsByProjectAndStatisticsTypeId(project.getId(), StatisticsEnum.StatisticsHeatingPowerCost.value());
        if (deviceIds == null) {
            return new ArrayList<>();
        }
        return deviceIds;
    }

    /**
     * 功能描述:
     * <返回所有需要进行制冷能耗统计的采集点(指定项目)
     * <如果查询结果为空，就返回空列表，不返回null
     *
     * @param project
     * @return
     */
    @Override
    public List<Integer> findAllCoolingPowercostDeviceIds(Project project) {
        List<Integer> deviceIds = statisticsConfigDao.findDeviceIdsByProjectAndStatisticsTypeId(project.getId(), StatisticsEnum.StatisticsCoolingPowerCost.value());
        if (deviceIds == null) {
            return new ArrayList<>();
        }
        return deviceIds;
    }

    /**
     * 功能描述:
     * <返回所有需要进行供暖量统计的采集点(指定项目)
     * <如果查询结果为空，就返回空列表，不返回null
     *
     * @param project
     * @return
     */
    @Override
    public List<Integer> findAllHeatingEnergyDeviceIds(Project project) {
        List<Integer> deviceIds = statisticsConfigDao.findDeviceIdsByProjectAndStatisticsTypeId(project.getId(), StatisticsEnum.StatisticsHeatingEnergy.value());
        if (deviceIds == null) {
            return new ArrayList<>();
        }
        return deviceIds;
    }

    /**
     * 功能描述:
     * <返回所有需要进行制冷量统计的采集点(指定项目)
     * <如果查询结果为空，就返回空列表，不返回null
     *
     * @param project
     * @return
     */
    @Override
    public List<Integer> findAllCoolingEnergyDeviceIds(Project project) {
        List<Integer> deviceIds = statisticsConfigDao.findDeviceIdsByProjectAndStatisticsTypeId(project.getId(), StatisticsEnum.StatisticsCoolingEnergy.value());
        if (deviceIds == null) {
            return new ArrayList<>();
        }
        return deviceIds;
    }

    /**
     * 功能描述:
     * <返回能耗占比中 按照分类 返回分类中的所有采集点
     * <分类1-分类1中的所有采集点
     * <...
     * <分类N-分类N中的所有采集点
     * <采集点列表如果为空则返回空列表，不会返回null
     *
     * @param project
     * @return
     */
    @Override
    public Map<String, List<Integer>> findAllPowercostRateTypeAndDeviceIds(Project project) {
        List<StatisticsPowercostRateType> statisticsPowercostRateTypes = statisticsPowercostRateTypeDao.findStatisticsPowercostRateTypeByProjectOrderByName(project);
        Map<String, List<Integer>> map = new HashMap<>();
        for (StatisticsPowercostRateType statisticsPowercostRateType : statisticsPowercostRateTypes) {
            List<Integer> deviceIds = statisticsPowercostRateConfigDao.findDeviceIdsByStatisticsPowercostRateTypeId(statisticsPowercostRateType.getId());
            if (deviceIds == null) {
                map.put(statisticsPowercostRateType.getName(), new ArrayList<>());
            } else {
                map.put(statisticsPowercostRateType.getName(), deviceIds);
            }
        }
        return map;
    }

    /**
     * 功能描述:
     * <返回机组能效中 按照机组分类 返回分类中的所有供冷量或者供暖量采集点
     * <机组1-机组1中的供冷量或者供暖量采集点
     * <...
     * <机组N-机组N中的供冷量或者供暖量采集点
     *
     * @param project
     * @return
     */
    @Override
    public Map<String, List<Integer>> findAllMachineGroupAndEnergyDeviceIds(Project project) {
        List<MachineGroup> machineGroups = machineGroupDao.findMachineGroupsByProjectOrderByName(project);
        Map<String, List<Integer>> map = new HashMap<>();
        for (MachineGroup machineGroup : machineGroups) {
            //type=1表示是 制冷量或者供暖量
            List<Integer> deviceIds = machineGroupDao.findDeviceIdsByMachineGroupIdAndType(machineGroup.getId(), 1);
            if (deviceIds == null) {
                map.put(machineGroup.getName(), new ArrayList<>());
            } else {
                map.put(machineGroup.getName(), deviceIds);
            }
        }
        return map;
    }

    /**
     * 功能描述:
     * <返回机组能效中 按照机组分类 返回分类中的所有能耗采集点
     * <机组1-机组1中的能耗采集点
     * <...
     * <机组N-机组N中的能耗采集点
     *
     * @param project
     * @return
     */
    @Override
    public Map<String, List<Integer>> findAllMachineGroupAndPowercostDeviceIds(Project project) {
        List<MachineGroup> machineGroups = machineGroupDao.findMachineGroupsByProjectOrderByName(project);
        Map<String, List<Integer>> map = new HashMap<>();
        for (MachineGroup machineGroup : machineGroups) {
            //type=0表示是能耗
            List<Integer> deviceIds = machineGroupDao.findDeviceIdsByMachineGroupIdAndType(machineGroup.getId(), 0);
            if (deviceIds == null) {
                map.put(machineGroup.getName(), new ArrayList<>());
            } else {
                map.put(machineGroup.getName(), deviceIds);
            }
        }
        return map;
    }

    /**
     * 功能描述:
     * <返回系统能耗指标 制冷模式 所有能耗采集点ID
     *
     * @param project
     * @return
     */
    @Override
    public List<Integer> findAllSystemPowercostStdOnCoolingModeDevices(Project project) {
        return statisticsConfigDao.findDeviceIdsByStatisticsTypeId(StatisticsEnum.StatisticsPowercostStdCooling.value());
    }

    /**
     * 功能描述:
     * <返回系统能耗指标 供暖模式 所有能耗采集点ID
     *
     * @param project
     * @return
     */
    @Override
    public List<Integer> findAllSystemPowercostStdOnHeatingModeDevices(Project project) {
        return statisticsConfigDao.findDeviceIdsByStatisticsTypeId(StatisticsEnum.StatisticsPowercostStdHeating.value());
    }
}
